package com.example.administrator.appstpremvpdemo.wegit;

import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;

import com.example.administrator.appstpremvpdemo.binder.BaseViewBinder;
import com.example.administrator.appstpremvpdemo.binder.ViewBinderFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2017/12/2 0002.
 * 参数：一般我们写adapter的时候，传递的数据基本都是需要，context,data,layoutId等基本的
 * 当然也有我们有时候也需要多种布局的适配器，也可以在参数中传递ismultitype这样的标志来选用
 * 多布局类型的multitypeadapter,
 */

public class CommonAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<T> mData = null;
    private int mTtemviewType;
    private BaseViewBinder.OnItemClickListener mOnItemClickListener;
    private final Object mLock = new Object();

    public CommonAdapter(List<T> data) {
        if (data == null) {
            data = new ArrayList<>();
        }
        this.mData = data;
    }

    @Override
    public BaseViewBinder onCreateViewHolder(ViewGroup parent, int viewType) {
        //这里就明白了为啥吧ViewHolder的get方法定义为静态的
        //改写
        BaseViewBinder viewBinder = ViewBinderFactory.getBinderFromLayoutId(parent, viewType);

        if (viewBinder != null && mOnItemClickListener != null) {
            viewBinder.setOnViewClickListener(mOnItemClickListener);
        }

        return viewBinder;
        //注意，这里没用到viewtype参数，当我们需要多种布局的时候会用到，
        //使用switch case的形式并根据viewtype来返回不同的viewholder
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder binder, int position) {
        BaseViewBinder baseViewBinder = (BaseViewBinder) binder;
        baseViewBinder.setItemPosition(position);
        baseViewBinder.bind(getItemObj(position));
    }

    @Override
    public int getItemCount() {
        return mData == null ? 0 : mData.size();
    }

    public T getItemObj(int position) {
        return mData == null ? null : mData.get(position);
    }

    @Override
    public int getItemViewType(int position) {
        return mTtemviewType;
    }

    public void setItemViewType(int itemType) {
        mTtemviewType = itemType;
    }

    public void setOnItemClickListener(BaseViewBinder.OnItemClickListener onItemClickListener) {
        mOnItemClickListener = onItemClickListener;
    }

    /**
     * 获取适配器数据
     *
     * @return
     */
    public List<T> getData() {
        return mData;
    }

    /**
     * 通过adapter设置数据进行数据初始化
     *
     * @param data
     */
    public void setData(List<T> data) {
        mData = data;
    }

    /**
     * 添加元素
     *
     * @param elem
     */
    public void add(T elem) {

        synchronized (mLock) {
            mData.add(elem);
        }
        //notifyDataSetChanged();
    }

    /**
     * 添加元素集合
     *
     * @param list
     */
    public void addAll(List<T> list) {

        if (mData == null) {
            return;
        }
        synchronized (mLock) {
            for (T t : list) {
                add(t);
            }
        }

        notifyDataSetChanged();
    }

    /**
     * 删除某个元素
     *
     * @param elem
     */
    public void remove(T elem) {
        if (mData != null) {
            mData.remove(elem);
            notifyDataSetChanged();
        }
    }

    /**
     * 移除某个条目
     *
     * @param index 在datas中的角标
     */
    public void removeAt(int index) {
        if (mData != null) {
            mData.remove(index);
            notifyDataSetChanged();
        }
    }

    /**
     * 替换全部
     *
     * @param elem
     */
    public void replaceAll(List<T> elem) {
        if (mData != null) {
            mData.clear();
            mData.addAll(elem);
            notifyDataSetChanged();
        }
    }

    /**
     * 清除适配器所有数据
     */
    public void clear() {
        if (mData != null) {
            mData.clear();
            notifyDataSetChanged();
        }
    }

}
